package logic

import (
	"cloud-disk/global/db"
	"cloud-disk/model/entity"
	"cloud-disk/model/request"
	"cloud-disk/model/response"
	"errors"
	"fmt"
	"log"
)

func UserFileUploadLogic(uf entity.UserRepository) (int, error) {
	//
	res := db.DB().Create(&uf)
	err := res.Error
	affect := res.RowsAffected
	if err != nil {
		log.Println(err)
		return 0, errors.New("upload fail")
	}
	if affect <= 0 {
		log.Println(err)
		return 0, errors.New("exist file")
	}
	return uf.Id, nil
}

func hasSameName(uf entity.UserRepository) (bool, error) {
	var cnt int64
	err := db.DB().Model(&entity.UserRepository{}).Where("user_identity=? and parent_id=? and name=? and type=?", uf.UserIdentity, uf.ParentId, uf.Name, uf.Type).Count(&cnt).Error
	if err != nil {
		log.Println(err)
		return true, errors.New("unknown err")
	}
	if cnt > 0 {
		return true, nil
	}
	return false, nil
}

func UserFileListLogic(userIdentity string, req request.FileList) *[]response.FileList {
	res := []response.FileList{}
	err := db.DB().Table("user_repository as ur").
		Select("ur.id, ur.identity, ur.user_identity,ur.parent_id,ur.repository_identity,ur.type,ur.name,rp.size,ur.created_at, ur.updated_at,rp.status").
		Where("ur.user_identity=? and ur.parent_id= ?", userIdentity, req.ParentId).
		Joins("left join repository_pool as rp on rp.identity=ur.repository_identity", userIdentity).
		Limit(req.Size).Offset((req.Page - 1) * req.Size).
		Scan(&res).Error
	if err != nil {
		log.Println(err)
		return nil
	}
	return &res
}

// UserFileDeleteLogic 递归删除
func UserFileDeleteLogic(req request.UserFileDelete) error {
	ids := []int{}
	err := db.DB().Model(&entity.UserRepository{}).Raw("select id from (select * from user_repository) user_repository, (select @pv := ? ) initialisation where   (find_in_set(parent_id, @pv) > 0 and @pv := concat(@pv, ',', id)) or id=?", req.Id, req.Id).Scan(&ids).Error
	if err != nil {
		log.Println(err)
		return err
	}
	fmt.Println(ids)
	res := db.DB().Delete(&entity.UserRepository{}, ids)
	err = res.Error
	affect := res.RowsAffected
	if affect <= 0 {
		return errors.New("no file to delete")
	}
	return err
}

func UserFileMoveLogic(req request.UserFileMove) (err error) {
	err = db.DB().Model(&entity.UserRepository{}).Where("id=?", req.Id).Update("parent_id", req.ParentId).Error
	if err != nil {
		log.Println(err)
		return errors.New("update fail")
	}
	return nil
}
func UserFileRenameLogic(req request.UserFileRename) (err error) {
	err = db.DB().Model(&entity.UserRepository{}).Where("id=?", req.Id).Update("name", req.Name).Error
	if err != nil {
		log.Println(err)
		return errors.New("update fail")
	}
	return nil
}

//func CreateDirTreeLogic(userIdentity string, req request.DirTree) ([]*entity.UserRepository, error) {
//	res := []response.DirTree{}
//	if req.Type == "file" {
//		// todo 调用文件传送接口
//	}
//	if req.Type == ""
//	if req.Type == "dir" {
//		res = append(res)
//	}
//	curr := res
//	// 队列Q里只存dir
//	Q := []request.DirTree{req}
//	db.DB().Begin()
//	for len(Q) > 0 {
//		size := len(Q)
//		for k := 0; k < size; k++ {
//			node := Q[0]
//			// 如果该类型是文件夹，那么直接往数据库插入该文件夹 包括生成identity啥的 否则只赋予其上层的id
//			now := time.Now()
//			ur := entity.UserRepository{
//				Identity:     util.UUID(),
//				UserIdentity: userIdentity,
//				ParentId:     req.ParentId,
//				Type:         "dir",
//				Name:         node.Name,
//				CreatedAt:    now,
//				UpdatedAt:    now,
//			}
//			err := db.DB().Create(&ur).Error
//			if err != nil {
//				fmt.Println(err)
//				return nil, errors.New("unknown error")
//			}
//			// 创建完就拿到这个节点的id了 然后将其子节点赋予id 然后存入
//			if len(node.Children) > 0 {
//				for i := 0; i < len(node.Children); i++ {
//					node.Children[i].ParentId = ur.Id
//					// 如果子节点是目录就加入Q
//					if node.Children[i].Type == "dir" {
//						Q = append(Q, node.Children[i])
//					}
//					// 不然就是普通的赋予Pid 然后加入到结果数组
//
//				}
//			}
//			// 加完了之后，将加好的结果存入这一层children
//
//		}
//		Q = Q[size:]
//	}
//}
